
import { FormArray } from "./FormArray";
import { FormControl } from "./FormControl";
import { FormGroup } from "./FormGroup";

/** 定义验证器类型 */
export type ValidatorTypes = 'required' | 'mobile' | 'email' | 'idcard' | 'true' | 'unique'
	| 'maxLength' | 'minLength' | 'fixLength' | 'max_number' | 'min_number' | 'max_date' | 'min_date' | 'reg';

export interface CSSProperties { [key: string]: any }

// 验证器方法类型
export interface ValidatorFn {
	(value?: any): {
		valid: boolean,
		type?: ValidatorTypes | string,
		data?: any,
	} | Promise<{
		valid: boolean,
		type?: ValidatorTypes | string,
		data?: any,
	}>
}

// 值发生改变回调类型
export interface ValueChangeFn {
	(res: any): void;
}

// 验证结果生改变回调类型
export interface ValidChangeFn {
	(res: boolean): void;
}

// 脏值发生改变回调类型
export interface DirtyChangeFn {
	(res: boolean): void;
}

/** 显示值改变，回调函数 */
export interface ShowValueChangeFn {
	(res: any): void;
}


export interface FormItems {
	[key: string]: FormControl | FormGroup | FormArray,
}

/**
 * 选择器
 */
export type SelectorType =
	'' | 'input' | 'textarea' | 'select' | 'date' | 'number' | 'currency' | 'rich' |
	'hidden' | 'password' | 'cascader' | 'radio' | 'files' | 'markdown' | 'switch' |
	'dropdown' | 'checkbox' | 'startend' | 'picker' | 'datePicker' | 'cascadePicker' | 'textareaModal';
export interface Option {
	value: any,
	label: string,
	disabled?: boolean,
	children?: Option[],
}
/** 布局 */
export type Layout = 'horizontal' | 'vertical';

/**
 * formControl数据
 */
export interface FormControlData {
	/** 字段标识 */
	key?: string,
	/** 值 */
	value?: any,
	/** 验证器 */
	validators?: Array<ValidatorTypes | ValidatorFn>,
	/** 标签 */
	label?: string,
	/** placeholder */
	placeholder?: string,
	/** 选择器 */
	selector?: SelectorType,
	/** 下拉选项 */
	options?: Option[],
	/** 是否显示 label */
	showLabel?: boolean,
	/** 是否有边框 */
	bordered?: boolean,
	/** 样式 */
	style?: CSSProperties,
	/** 标签样式 */
	labelStyle?: CSSProperties,
	/** className */
	className?: string,
	/** 前缀图标 */
	prefix?: any,
	/** 后缀图标 */
	suffix?: any,
	/** 最大长度 */
	inputMaxlength?: number,
	/** 表单关联数据 */
	dataflow?: null | Dataflow,
	/** 必填 */
	required?: boolean,
	/** 只读 */
	readonly?: boolean,
	/** 隐藏 */
	hidden?: boolean,
	/** 禁用 */
	disabled?: boolean,
	/** 主表表单 */
	form?: FormGroup,
	/** 日志开关 */
	loggingSwitch?: boolean,
	/** 延迟 */
	debounce?: number,
	/** 布局 */
	layout?: Layout,
	/** 可以点击清除图标重置数据 */
	resetBtn?: boolean,
	/** onPressEnter */
	onPressEnter?: PressEnterFn,
	/** 是否支持多选 */
	multiple?: boolean,
	/** 上传文件类型 */
	uploadType?: UploadType,
	/** 字段说明 */
	tips?: string,
	/** 指定输入框展示值的格式 仅用于number #,###,##0.00 */
	// formatter?:(value: number | string)=>string,
	/** 外键模块 */
	divedown_module?: string,
	/** 是否拖拽排序 */
	draggable?: boolean,
	/** 清除按钮 */
	allowClear?: boolean,
	/** 显示值 */
	showValue?: any
	/** 组件大小 */
	size?: 'large' | 'middle' | 'small'
	/** 开始结束值数据类型 */
	startEndType?: 'date' | 'number' | 'currency',
}



/** 表单关联数据 */
interface Dataflow {
	/** 模块名称 */
	front_module: string,
	/** 字段流程id，发送请求时使用 */
	id: string,
	/** 是否多选 */
	allow_merge: 1 | 0,
	/** 是否显示连接 */
	dive_down: 1 | 0,
}


/** value 改变的回调 */
export interface ValueChangeFn {
	(res: any): void;
}
/** 验证结果发生改变时，回调函数 */
export interface ValidChangeFn {
	(res: boolean): void;
}
/** 脏值改变的回调 */
export interface DirtyChangeFn {
	(res: boolean): void;
}
/** 标签样改变，回调函数 */
export interface LabelStyleChangeFn {
	(res: CSSProperties): void;
}
/** 选择器样式改变，回调函数 */
export interface SelectorStyleChangeFn {
	(res: CSSProperties): void;
}
/** 标签改变，回调函数 */
export interface LabelChangeFn {
	(res: string): void;
}



export interface FormGroupData {
	[key: string]: any
}



/** readonly 改变回调 */
export interface ReadonlyChangeFn {
	(res: boolean): void;
}
/** hidden 改变回调 */
export interface HiddenChangeFn {
	(res: boolean): void;
}
/** options 改变回调 */
export interface OptionsChangeFn {
	(ops: Option[]): void;
}
/** placeholder 改变回调 */
export interface SelectorChangeFn {
	(selector: SelectorType): void;
}
/** 选择器 改变回调 */
export interface PlaceholderChangeFn {
	(res: string): void;
}
/** 数据 改变回调 */
export interface updateChangeFn {
	(): void;
}
/** 颜色 回调 */
export interface ColorChangeFn {
	(res: string): void;
}
/** 日志修改者 */
export type Modifier = '' | 'dataflow' | 'user' | 'bot' | 'init';
/** 上传文件类型 */
export type UploadType = 'image' | 'file' | 'video' | 'audio';
/** 日志 */
export interface FormControlLog {
	/** 改变的value */
	value: any,
	/** 修改者 */
	modifier: Modifier,
	/** 修改时间 */
	createTime: string,
	/** 时间差 */
	diff: number,
}
/** 按下回车的回调 */
export type PressEnterFn = (e: any) => void;


/** FormControl 错误类型 */
export interface ControlErrorType {
	type: ValidatorTypes | string,
	data?: any,
};

/** FormGroup 错误类型 */
export interface GroupError {
	errorKey: string,
	errorItem: FormArray | FormControl | FormGroup,
};

/** FormArray 错误类型 */
export type ArrayError = {
	errorIndex: number,
	errorItem: FormArray | FormControl | FormGroup,
};